# Functional programming
## [Функции, лямбды (стрелочные функции), контексты, замыкания в JavaScript](https://youtu.be/pn5myCmpV2U)
- [00:00:00  Введение ](https://youtu.be/pn5myCmpV2U?t=0)
- [    00:11:22  Функция объявление (Declaration)](https://youtu.be/pn5myCmpV2U?t=682)
- [    00:12:46  Функция выражение (Expression)](https://youtu.be/pn5myCmpV2U?t=766)
- [    00:16:07  Лямбда-выражение (Lambda expression) или функция-стрелка (Arrow function) ](https://youtu.be/pn5myCmpV2U?t=967)
- [    00:16:43  Лямбда-функция (Lambda function) ](https://youtu.be/pn5myCmpV2U?t=1003)
- [    00:18:45  Область видимости (Scope)](https://youtu.be/pn5myCmpV2U?t=1125)
- [    00:25:00  Функции, как абстракции](https://youtu.be/pn5myCmpV2U?t=1500)
- [    00:26:43  Методы функции  (name, length, toString( ) )](https://youtu.be/pn5myCmpV2U?t=1603)
- [    00:31:26  Значения по умолчанию у функции ](https://youtu.be/pn5myCmpV2U?t=1886)
- [    00:36:46  Rest-оператор (...args)](https://youtu.be/pn5myCmpV2U?t=2206)
- [    00:41:49  Способ определения функции, через new Function](https://youtu.be/pn5myCmpV2U?t=2509)
- [    00:44:46  Функции внутри объекта](https://youtu.be/pn5myCmpV2U?t=2686)
- [    00:50:42  Обращение к полям объекта из привязанной функции, через this](https://youtu.be/pn5myCmpV2U?t=3042)
- [    00:55:24  История синтаксиса создания контекстов, через самовызывающиеся функции ( IIFE)](https://youtu.be/pn5myCmpV2U?t=3324)
- [    00:58:30  Методы функции, наследуемой от объекта  (call, apply)](https://youtu.be/pn5myCmpV2U?t=3510)
- [    01:00:53  Комментирование функций](https://youtu.be/pn5myCmpV2U?t=3653)
- [    01:01:27  Задание декомпозиции  функции](https://youtu.be/pn5myCmpV2U?t=3687)
- [    01:04:24  Замыкание: context   ](https://youtu.be/pn5myCmpV2U?t=3864)
- [    01:08:41  Замыкание: chainning   ](https://youtu.be/pn5myCmpV2U?t=4121)
- [    01:11:55  Замыкание: summator  ](https://youtu.be/pn5myCmpV2U?t=4315)
- [    01:14:16  Замыкание: recursion](https://youtu.be/pn5myCmpV2U?t=4456)
## [Частичное применение и каррирование в JavaScript ( Partial application )](https://youtu.be/ND8KQ5xjk7o)
- [00:00:00  Замыкание  ](https://youtu.be/ND8KQ5xjk7o?t=0)
- [        00:04:54  Лямбда- функция ](https://youtu.be/ND8KQ5xjk7o?t=294)
- [        00:06:06  Метод  bind  ](https://youtu.be/ND8KQ5xjk7o?t=366)
- [        00:08:30  Абстрагированный пример функции   ](https://youtu.be/ND8KQ5xjk7o?t=510)
- [        00:13:42  Абстрагированный пример функции  (расширение)  ](https://youtu.be/ND8KQ5xjk7o?t=822)
- [        ------------------------------------------  Рекурсивное частичное применение ( Currying ) ------------------------------------------](https://youtu.be/ND8KQ5xjk7o?t=0)
- [        00:15:47  Неправильная реализация каррирования  ](https://youtu.be/ND8KQ5xjk7o?t=947)
- [        00:22:22  Правильная реализация каррирования ](https://youtu.be/ND8KQ5xjk7o?t=1342)
- [        00:28:54  Правильная реализация каррирования  (расширение)](https://youtu.be/ND8KQ5xjk7o?t=1734)
- [        -------------------------------  Объединение из нескольких функций одной ( Composition )  --------------------------------](https://youtu.be/ND8KQ5xjk7o?t=0)
- [        00:31:41  Функциональные абстракции (superposition)](https://youtu.be/ND8KQ5xjk7o?t=1901)
- [        00:38:02  Функциональные абстракции, с сохранением выражений (composition)](https://youtu.be/ND8KQ5xjk7o?t=2282)
- [        00:45:05  Композиция с 2 функциями](https://youtu.be/ND8KQ5xjk7o?t=2705)
- [        00:46:05  Композиция с n - функциями, при помощи метода reduce](https://youtu.be/ND8KQ5xjk7o?t=2765)
- [        00:51:25  Композиция с n - функциями, при помощи цикла  ](https://youtu.be/ND8KQ5xjk7o?t=3085)
- [        00:54:29  Композиция с n - функциями, при помощи рекурсии](https://youtu.be/ND8KQ5xjk7o?t=3269)
- [        00:57:40  Композиция асинхронных функций  ](https://youtu.be/ND8KQ5xjk7o?t=3460)
- [        01:01:27  Обобщение](https://youtu.be/ND8KQ5xjk7o?t=3687)
## [Функции высшего порядка, колбеки, события на JavaScript (HigherOrderFunctions, callbacks, events)](https://youtu.be/1vqATwbGHnc)
- [00:00:00  Определение ](https://youtu.be/1vqATwbGHnc?t=0)
- [            00:02:03  Математическая функция ](https://youtu.be/1vqATwbGHnc?t=123)
- [            00:05:57  Функция обратного вызова (callback) ](https://youtu.be/1vqATwbGHnc?t=357)
- [            00:09:33  Замыкание ](https://youtu.be/1vqATwbGHnc?t=573)
- [            00:10:51  Цепочка вызовов  ](https://youtu.be/1vqATwbGHnc?t=651)
- [            00:12:40  Сохранение кэша с помощью замыкания](https://youtu.be/1vqATwbGHnc?t=760)
- [            00:18:29  Добавление функции поведение логирования](https://youtu.be/1vqATwbGHnc?t=1109)
- [            00:21:45  Обобщение ](https://youtu.be/1vqATwbGHnc?t=1305)
- [            ---------------------------------- Применение функций высшего порядка  ---------------------------------------------------](https://youtu.be/1vqATwbGHnc?t=0)
- [            00:22:45  Сallback](https://youtu.be/1vqATwbGHnc?t=1365)
- [            00:25:32  Сallback асинхронной функции считывание файла](https://youtu.be/1vqATwbGHnc?t=1532)
- [            00:28:36  Сallback именованный](https://youtu.be/1vqATwbGHnc?t=1716)
- [            00:33:01  Сallback-timer ](https://youtu.be/1vqATwbGHnc?t=1981)
- [            00:36:20  Сallback-timer-curry](https://youtu.be/1vqATwbGHnc?t=2180)
- [            00:38:59  Listener](https://youtu.be/1vqATwbGHnc?t=2339)
- [            00:41:10  Listener-timer](https://youtu.be/1vqATwbGHnc?t=2470)
- [            00:46:59  Event](https://youtu.be/1vqATwbGHnc?t=2819)
- [            00:53:45  Event-imitter  ](https://youtu.be/1vqATwbGHnc?t=3225)
- [            00:57:48  Deferred object (отложенный объект)](https://youtu.be/1vqATwbGHnc?t=3468)
- [            01:01:31  Errors](https://youtu.be/1vqATwbGHnc?t=3691)
## [Примеси, обертки, декораторы, мемоизация в JavaScript (Wrappers)](https://youtu.be/oRQ0kQr1N-U)
- [00:00:00  Синхронная функция-обертка  ](https://youtu.be/oRQ0kQr1N-U?t=0)
- [            00:02:55  Синхронная универсальная функция-обертка   ](https://youtu.be/oRQ0kQr1N-U?t=175)
- [            00:08:28  Асинхронная универсальная функция-обертка  ](https://youtu.be/oRQ0kQr1N-U?t=508)
- [            00:15:50  Синхронная функция-обертка, которая добавляет поведение (timeout)](https://youtu.be/oRQ0kQr1N-U?t=950)
- [            00:22:45  Асинхронная функция-обертка, которая добавляет поведение (timeout)](https://youtu.be/oRQ0kQr1N-U?t=1365)
- [            00:25:38  Функция-обертка, которая ограничивает вызов функции до одного вызова (once) ](https://youtu.be/oRQ0kQr1N-U?t=1538)
- [            00:27:36  Функция-обертка, которая ограничивает вызов функции до  n-го вызова (limit)](https://youtu.be/oRQ0kQr1N-U?t=1656)
- [            00:29:50  Функция-обертка, которая отменяет вызов функции (cancel)](https://youtu.be/oRQ0kQr1N-U?t=1790)
- [            00:32:29  Функция-обертка с методами timeout, limit, cancel](https://youtu.be/oRQ0kQr1N-U?t=1949)
- [            00:39:03  Функция-обертка с методами timeout, limit, cancel (оптимизированная)](https://youtu.be/oRQ0kQr1N-U?t=2343)
- [            00:42:28  Функция-обертка, которая ограничивает один вызов за 200 мс (throttle)](https://youtu.be/oRQ0kQr1N-U?t=2548)
- [            -----------------------------------------------------------  Примеси (Mixins) ---------------------------------------------------------------](https://youtu.be/oRQ0kQr1N-U?t=0)
- [            00:45:47  Примесь поля через точку  ](https://youtu.be/oRQ0kQr1N-U?t=2747)
- [            00:51:35  Примесь поля через  функцию extend](https://youtu.be/oRQ0kQr1N-U?t=3095)
- [            00:57:35  Примесь поля через object.assign( )](https://youtu.be/oRQ0kQr1N-U?t=3455)
- [            00:59:18  Примесь поведения    ](https://youtu.be/oRQ0kQr1N-U?t=3558)
- [            01:02:23  Примесь изменения класса](https://youtu.be/oRQ0kQr1N-U?t=3743)
- [            ---------------------------------------------------  Мемоизация  (Memoization)  ---------------------------------------------------](https://youtu.be/oRQ0kQr1N-U?t=0)
- [            01:06:50  Определение](https://youtu.be/oRQ0kQr1N-U?t=4010)
- [            01:07:30  Реализация простой мемоизации       ](https://youtu.be/oRQ0kQr1N-U?t=4050)
- [            01:14:43  Реализация простой мемоизации с проверкой скорости  ](https://youtu.be/oRQ0kQr1N-U?t=4483)
- [            01:20:43  Удаление накопленного кэша   ](https://youtu.be/oRQ0kQr1N-U?t=4843)
- [            01:25:35  Асинхронная мемоизация ](https://youtu.be/oRQ0kQr1N-U?t=5135)
- [            01:31:10  Преобразование аргументов и ключей в  hash-функцию](https://youtu.be/oRQ0kQr1N-U?t=5470)
- [            01:33:32  Реализация сложной мемоизации](https://youtu.be/oRQ0kQr1N-U?t=5612)
## [Чеининг функций и объектов, обработка ошибок в JavaScript](https://youtu.be/PfuEfIiLX34)
- [00:00:00  Введение ](https://youtu.be/PfuEfIiLX34?t=0)
- [            00:01:10  Чеининг через синтаксис вызова функций  ](https://youtu.be/PfuEfIiLX34?t=70)
- [            00:02:12  Prototype  ](https://youtu.be/PfuEfIiLX34?t=132)
- [            00:05:45  Сlass](https://youtu.be/PfuEfIiLX34?t=345)
- [            00:06:11  Functor](https://youtu.be/PfuEfIiLX34?t=371)
- [            00:11:54  Mutable](https://youtu.be/PfuEfIiLX34?t=714)
- [            00:16:34  Iterator](https://youtu.be/PfuEfIiLX34?t=994)
- [            00:26:18  Promise  ](https://youtu.be/PfuEfIiLX34?t=1578)
- [            00:26:35  Test](https://youtu.be/PfuEfIiLX34?t=1595)
- [            00:37:08  Compare ](https://youtu.be/PfuEfIiLX34?t=2228)
- [            00:39:45  Benchmark](https://youtu.be/PfuEfIiLX34?t=2385)
- [            00:40:48  Запуск и анализ тестов ](https://youtu.be/PfuEfIiLX34?t=2448)
- [            ----------------------------------------------------  Обработка ошибок --------------------------------------------------](https://youtu.be/PfuEfIiLX34?t=0)
- [            01:03:48  Первый способ возвращение ошибок в синхронном коде   ](https://youtu.be/PfuEfIiLX34?t=3828)
- [            01:09:24  Второй способ возвращение ошибок в синхронном коде ](https://youtu.be/PfuEfIiLX34?t=4164)
- [            01:12:26  Возвращение ошибок в асинхронном коде     ](https://youtu.be/PfuEfIiLX34?t=4346)
- [            01:16:14  Корректное возвращение ошибок      ](https://youtu.be/PfuEfIiLX34?t=4574)
- [            01:20:03  Обработка ошибок c promise  ](https://youtu.be/PfuEfIiLX34?t=4803)
- [            01:23:58  Обработка ошибок c async-await](https://youtu.be/PfuEfIiLX34?t=5038)
## [Функциональное программирование на JavaScript](https://youtu.be/0JxSs_GcvbQ)
- [](https://youtu.be/0JxSs_GcvbQ?t=0)
## [Функциональные объекты, функторы и монады в JavaScript](https://youtu.be/3Z7f0Gi8pxw)
- [00:00:00  Определение функтора  ](https://youtu.be/3Z7f0Gi8pxw?t=0)
- [            00:01:40  Функтор из прототипа     ](https://youtu.be/3Z7f0Gi8pxw?t=100)
- [            00:08:17  Функтор из прототипа (упрощенный)  ](https://youtu.be/3Z7f0Gi8pxw?t=497)
- [            00:09:14  Функтор из замыкания  ](https://youtu.be/3Z7f0Gi8pxw?t=554)
- [            00:11:49  Функтор из замыкания с тернарным оператором](https://youtu.be/3Z7f0Gi8pxw?t=709)
- [            00:12:44  Аппликативный функтор из прототипа  ](https://youtu.be/3Z7f0Gi8pxw?t=764)
- [            00:18:08  Аппликативный функтор из замыкания (монада)](https://youtu.be/3Z7f0Gi8pxw?t=1088)
- [            00:23:11  Пример применения монады     ](https://youtu.be/3Z7f0Gi8pxw?t=1391)
- [            00:28:37  Функциональный объект   ](https://youtu.be/3Z7f0Gi8pxw?t=1717)
- [            00:39:44  Пример применения функционального объекта](https://youtu.be/3Z7f0Gi8pxw?t=2384)
- [            00:45:27  Обобщение](https://youtu.be/3Z7f0Gi8pxw?t=2727)
## [Отмена асинхронных операций, cancellable callback and Promise в JavaScript](https://youtu.be/T8fXlnqI4Ws)
- [](https://youtu.be/T8fXlnqI4Ws?t=0)
## [Future: Асинхронность на фьючерах без состояния](https://youtu.be/22ONv3AGXdk)
- [](https://youtu.be/22ONv3AGXdk?t=0)
## [Примеси, обертки, декораторы, мемоизация](https://youtu.be/2h9syXN5wO0)
- [---------------------------------------------------- Функции-обертки  (Wrappers) ------------------------------------------------](https://youtu.be/2h9syXN5wO0?t=0)
- [            00:00:00  Синхронная функция-обертка  ](https://youtu.be/2h9syXN5wO0?t=0)
- [            00:02:55  Синхронная универсальная функция-обертка   ](https://youtu.be/2h9syXN5wO0?t=175)
- [            00:08:28  Асинхронная универсальная функция-обертка  ](https://youtu.be/2h9syXN5wO0?t=508)
- [            00:15:50  Синхронная функция-обертка, которая добавляет поведение (timeout)](https://youtu.be/2h9syXN5wO0?t=950)
- [            00:22:45  Асинхронная функция-обертка, которая добавляет поведение (timeout)](https://youtu.be/2h9syXN5wO0?t=1365)
- [            00:25:38  Функция-обертка, которая ограничивает вызов функции до одного вызова (once) ](https://youtu.be/2h9syXN5wO0?t=1538)
- [            00:27:36  Функция-обертка, которая ограничивает вызов функции до  n-го вызова (limit)](https://youtu.be/2h9syXN5wO0?t=1656)
- [            00:29:50  Функция-обертка, которая отменяет вызов функции (cancel)](https://youtu.be/2h9syXN5wO0?t=1790)
- [            00:32:29  Функция-обертка с методами timeout, limit, cancel](https://youtu.be/2h9syXN5wO0?t=1949)
- [            00:39:03  Функция-обертка с методами timeout, limit, cancel (оптимизированная)](https://youtu.be/2h9syXN5wO0?t=2343)
- [            00:42:28  Функция-обертка, которая ограничивает один вызов за 200 мс (throttle)](https://youtu.be/2h9syXN5wO0?t=2548)
- [            -----------------------------------------------------------  Примеси (Mixins) ---------------------------------------------------------------](https://youtu.be/2h9syXN5wO0?t=0)
- [            00:45:47  Примесь поля через точку  ](https://youtu.be/2h9syXN5wO0?t=2747)
- [            00:51:35  Примесь поля через  функцию extend](https://youtu.be/2h9syXN5wO0?t=3095)
- [            00:57:35  Примесь поля через object.assign( )](https://youtu.be/2h9syXN5wO0?t=3455)
- [            00:59:18  Примесь поведения    ](https://youtu.be/2h9syXN5wO0?t=3558)
- [            01:02:23  Примесь изменения класса](https://youtu.be/2h9syXN5wO0?t=3743)
- [            ---------------------------------------------------  Мемоизация  (Memoization)  ---------------------------------------------------](https://youtu.be/2h9syXN5wO0?t=0)
- [            01:06:50  Определение](https://youtu.be/2h9syXN5wO0?t=4010)
- [            01:07:30  Реализация простой мемоизации       ](https://youtu.be/2h9syXN5wO0?t=4050)
- [            01:14:43  Реализация простой мемоизации с проверкой скорости  ](https://youtu.be/2h9syXN5wO0?t=4483)
- [            01:20:43  Удаление накопленного кэша   ](https://youtu.be/2h9syXN5wO0?t=4843)
- [            01:25:35  Асинхронная мемоизация ](https://youtu.be/2h9syXN5wO0?t=5135)
- [            01:31:10  Преобразование аргументов и ключей в  hash-функцию](https://youtu.be/2h9syXN5wO0?t=5470)
- [            01:33:32  Реализация сложной мемоизации](https://youtu.be/2h9syXN5wO0?t=5612)
## [Мемоизация функций: memoize в JavaScript](https://youtu.be/H6S8QJo2Qxg)
- [](https://youtu.be/H6S8QJo2Qxg?t=0)
## [Композиция функций (pipe, compose) в JavaScript](https://youtu.be/xS9FicVrOTI)
- [](https://youtu.be/xS9FicVrOTI?t=0)
